﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class TipoMedicamento
    {
        public int TipoMedicamentoId { get; set; }
        public string Descricao { get; set; }
        public bool IsNew { get { return this.TipoMedicamentoId == 0; } }
        private RzCorportativo.DataAccess.TipoMedicamento model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.TipoMedicamentoId = this.model.TipoMedicamentoId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.TipoMedicamento Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToTipoMedicamento(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.TipoMedicamento Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.TipoMedicamento CreateModel(RZCorporativoEntities entity)
        {
            var tipo = new RzCorportativo.DataAccess.TipoMedicamento();
            if (!this.IsNew)
            {
                tipo = entity.TipoMedicamento.Where(w => w.TipoMedicamentoId == this.TipoMedicamentoId).FirstOrDefault();
                if (tipo == null)
                    throw new Exception("Código inválido");
            }

            tipo.TipoMedicamentoId = this.TipoMedicamentoId;
            tipo.Descricao = this.Descricao;
            return tipo;
        }

        internal TipoMedicamento CreateTipoMedicamento(RzCorportativo.DataAccess.TipoMedicamento item)
        {
            var tipo = new TipoMedicamento();
            tipo.TipoMedicamentoId = item.TipoMedicamentoId;
            tipo.Descricao = item.Descricao;
            return tipo;
        }

        public static List<Lib.TipoMedicamento> Listar(Lib.TipoMedicamento tipo)
        {
            if (tipo == null)
                tipo = new TipoMedicamento();
            List<Lib.TipoMedicamento> tipos = new List<Lib.TipoMedicamento>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            tipos = db.TipoMedicamento.Where(w =>
                    ((tipo.TipoMedicamentoId == 0) || (tipo.TipoMedicamentoId == w.TipoMedicamentoId)) &&
                    ((tipo.Descricao == null || tipo.Descricao == "") || (w.Descricao.Contains(tipo.Descricao)))
                ).ToList().Select(s => tipo.CreateTipoMedicamento(s)).ToList();
            return tipos;
        }
    }
}
